package com.ruoyi.collect.service.impl;

import com.ruoyi.collect.domain.CollectTask;
import com.ruoyi.collect.mapper.CollectTaskMapper;
import com.ruoyi.collect.service.ICollectTaskService;
import com.ruoyi.common.utils.DateUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.List;

/**
 * 采集任务服务实现类
 *
 * @author ruoyi
 * @date 2025-11-07
 */
@Service
public class CollectTaskServiceImpl implements ICollectTaskService {

    private static final Logger log = LoggerFactory.getLogger(CollectTaskServiceImpl.class);

    @Autowired
    private CollectTaskMapper collectTaskMapper;

    /**
     * 查询采集任务
     *
     * @param taskId 任务ID
     * @return 采集任务
     */
    @Override
    public CollectTask selectCollectTaskById(Long taskId) {
        return collectTaskMapper.selectCollectTaskById(taskId);
    }

    /**
     * 查询采集任务列表
     *
     * @param collectTask 采集任务
     * @return 采集任务列表
     */
    @Override
    public List<CollectTask> selectCollectTaskList(CollectTask collectTask) {
        return collectTaskMapper.selectCollectTaskList(collectTask);
    }

    /**
     * 新增采集任务
     *
     * @param collectTask 采集任务
     * @return 结果
     */
    @Override
    public int insertCollectTask(CollectTask collectTask) {
        collectTask.setCreateTime(DateUtils.getNowDate());
        collectTask.setStartTime(DateUtils.getNowDate());
        collectTask.setTaskStatus("0"); // 待执行
        collectTask.setCollectedCount(0);
        collectTask.setSuccessCount(0);
        collectTask.setFailureCount(0);
        return collectTaskMapper.insertCollectTask(collectTask);
    }

    /**
     * 修改采集任务
     *
     * @param collectTask 采集任务
     * @return 结果
     */
    @Override
    public int updateCollectTask(CollectTask collectTask) {
        collectTask.setUpdateTime(DateUtils.getNowDate());
        return collectTaskMapper.updateCollectTask(collectTask);
    }

    /**
     * 批量删除采集任务
     *
     * @param taskIds 需要删除的任务ID
     * @return 结果
     */
    @Override
    public int deleteCollectTaskByIds(Long[] taskIds) {
        return collectTaskMapper.deleteCollectTaskByIds(taskIds);
    }

    /**
     * 删除采集任务
     *
     * @param taskId 任务ID
     * @return 结果
     */
    @Override
    public int deleteCollectTaskById(Long taskId) {
        return collectTaskMapper.deleteCollectTaskById(taskId);
    }

    /**
     * 获取运行中的任务
     *
     * @return 运行中的任务列表
     */
    @Override
    public List<CollectTask> selectRunningTasks() {
        CollectTask query = new CollectTask();
        query.setTaskStatus("1"); // 运行中
        return selectCollectTaskList(query);
    }

    /**
     * 更新任务状态
     *
     * @param taskId 任务ID
     * @param status 新状态
     * @return 结果
     */
    @Override
    public int updateTaskStatus(Long taskId, String status) {
        CollectTask task = new CollectTask();
        task.setTaskId(taskId);
        task.setTaskStatus(status);
        task.setUpdateTime(DateUtils.getNowDate());

        if ("1".equals(status)) { // 运行中
            task.setStartTime(DateUtils.getNowDate());
        } else if ("2".equals(status) || "3".equals(status)) { // 已完成或失败
            task.setEndTime(DateUtils.getNowDate());
        }

        return collectTaskMapper.updateCollectTask(task);
    }

    /**
     * 更新任务进度
     *
     * @param taskId 任务ID
     * @param currentPage 当前页
     * @param totalPages 总页数
     * @param collectedCount 已采集数量
     * @return 结果
     */
    @Override
    public int updateTaskProgress(Long taskId, Integer currentPage, Integer totalPages, Integer collectedCount) {
        CollectTask task = new CollectTask();
        task.setTaskId(taskId);
        task.setCurrentPage(currentPage);
        task.setTotalPages(totalPages);
        task.setCollectedCount(collectedCount);
        task.setUpdateTime(DateUtils.getNowDate());

        // 计算进度
        if (totalPages != null && totalPages > 0) {
            int progress = (currentPage * 100) / totalPages;
            task.setProgress(progress);
        }

        return collectTaskMapper.updateCollectTask(task);
    }

    /**
     * 标记任务完成
     *
     * @param taskId 任务ID
     * @param successCount 成功数量
     * @param failureCount 失败数量
     * @return 结果
     */
    @Override
    public int completeTask(Long taskId, Integer successCount, Integer failureCount) {
        CollectTask task = new CollectTask();
        task.setTaskId(taskId);
        task.setTaskStatus("2"); // 已完成
        task.setSuccessCount(successCount);
        task.setFailureCount(failureCount);
        task.setEndTime(DateUtils.getNowDate());
        task.setUpdateTime(DateUtils.getNowDate());
        task.setProgress(100);

        // 计算执行时长
        CollectTask existing = selectCollectTaskById(taskId);
        if (existing != null && existing.getStartTime() != null) {
            long duration = (System.currentTimeMillis() - existing.getStartTime().getTime()) / 1000;
            task.setDuration((int) duration);
        }

        return collectTaskMapper.updateCollectTask(task);
    }

    /**
     * 标记任务失败
     *
     * @param taskId 任务ID
     * @param errorMsg 错误信息
     * @return 结果
     */
    @Override
    public int failTask(Long taskId, String errorMsg) {
        CollectTask task = new CollectTask();
        task.setTaskId(taskId);
        task.setTaskStatus("3"); // 失败
        task.setErrorMessage(errorMsg);
        task.setEndTime(DateUtils.getNowDate());
        task.setUpdateTime(DateUtils.getNowDate());

        // 计算执行时长
        CollectTask existing = selectCollectTaskById(taskId);
        if (existing != null && existing.getStartTime() != null) {
            long duration = (System.currentTimeMillis() - existing.getStartTime().getTime()) / 1000;
            task.setDuration((int) duration);
        }

        return collectTaskMapper.updateCollectTask(task);
    }
}
